home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / swtools / libdwarf / dwarf_error.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  7.9 KB  |  294 lines

  1. /*
  2.  
  3.     dwarf_error.c
  4.  
  5.  
  6.  
  7.     $Revision: 1.36 $ $Date: 1994/06/17 02:39:16 $
  8.  
  9. */
  10.  
  11. #include <libelf.h>
  12. #include <stdio.h>
  13. #include <sys/stat.h>
  14. #include <sys/types.h>
  15. #include <stdlib.h>
  16.  
  17. /* Array to hold string representation of errors. Any time a 
  18.    define is added to the list in libdwarf.h, a string should be 
  19.    added to this Array
  20. */
  21.  
  22. const char *_dwarf_errmsgs[] = {
  23.  
  24.     "No error (0)\n",
  25.     "DW_DLE_VMM 1 dwarf format/library version mismatch",
  26.     "DW_DLE_MAP 2 memory map failure",
  27.     "DW_DLE_LEE 3 libelf error",
  28.     "DW_DLE_NDS 4 no debug section",
  29.     "DW_DLE_NLS    5  no line section ",
  30.     "DW_DLE_ID     6  invalid descriptor for query ",
  31.     "DW_DLE_IOF    7  I/O failure ",
  32.     "DW_DLE_MAF    8  memory allocation failure ",
  33.     "DW_DLE_IA     9  invalid argument ",
  34.     "DW_DLE_MDE    10  mangled debugging entry ",
  35.     "DW_DLE_MLE    11  mangled line number entry ",
  36.     "DW_DLE_FNO    12  file not open ",
  37.     "DW_DLE_FNR    13  file not a regular file ",
  38.     "DW_DLE_FWA    14  file open with wrong access ",
  39.     "DW_DLE_NOB    15  not an object file ",
  40.     "DW_DLE_MOF    16  mangled object file header ",
  41.     "DW_DLE_EOLL   17  end of location list entries ",
  42.     "DW_DLE_NOLL   18  no location list section ",
  43.     "DW_DLE_BADOFF 19  Invalid offset ",
  44.     "DW_DLE_EOS    20  end of section  ",
  45.     "DW_DLE_ATRUNC 21  abbreviations section appears truncated",
  46.     "DW_DLE_BADBITC  22  Address size passed to dwarf bad",
  47.  
  48.     "DW_DLE_DBG_ALLOC 23",
  49.     "DW_DLE_FSTAT_ERROR 24",
  50.     "DW_DLE_FSTAT_MODE_ERROR 25",
  51.     "DW_DLE_INIT_ACCESS_WRONG 26",
  52.     "DW_DLE_ELF_BEGIN_ERROR 27",
  53.     "DW_DLE_ELF_GETEHDR_ERROR 28",
  54.     "DW_DLE_ELF_GETSHDR_ERROR 29",
  55.     "DW_DLE_ELF_STRPTR_ERROR 30",
  56.     "DW_DLE_DEBUG_INFO_DUPLICATE 31",
  57.     "DW_DLE_DEBUG_INFO_NULL 32",
  58.     "DW_DLE_DEBUG_ABBREV_DUPLICATE 33",
  59.     "DW_DLE_DEBUG_ABBREV_NULL 34",
  60.     "DW_DLE_DEBUG_ARANGES_DUPLICATE 35",
  61.     "DW_DLE_DEBUG_ARANGES_NULL 36",
  62.     "DW_DLE_DEBUG_LINE_DUPLICATE 37",
  63.     "DW_DLE_DEBUG_LINE_NULL (38)",
  64.     "DW_DLE_DEBUG_LOC_DUPLICATE (39)",
  65.     "DW_DLE_DEBUG_LOC_NULL (40)",
  66.     "DW_DLE_DEBUG_MACINFO_DUPLICATE (41)",
  67.     "DW_DLE_DEBUG_MACINFO_NULL (42)",
  68.     "DW_DLE_DEBUG_PUBNAMES_DUPLICATE (43)",
  69.     "DW_DLE_DEBUG_PUBNAMES_NULL (44)",
  70.     "DW_DLE_DEBUG_STR_DUPLICATE (45)",
  71.     "DW_DLE_DEBUG_STR_NULL (46)",
  72.     "DW_DLE_CU_LENGTH_ERROR (47)",
  73.     "DW_DLE_VERSION_STAMP_ERROR (48)",
  74.     "DW_DLE_ABBREV_OFFSET_ERROR (49)",
  75.     "DW_DLE_ADDRESS_SIZE_ERROR (50)",
  76.     "DW_DLE_DEBUG_INFO_PTR_NULL (51)",
  77.     "DW_DLE_DIE_NULL (52)",
  78.     "DW_DLE_STRING_OFFSET_BAD (53)",
  79.     "DW_DLE_DEBUG_LINE_LENGTH_BAD (54)",
  80.     "DW_DLE_LINE_PROLOG_LENGTH_BAD (55)",
  81.     "DW_DLE_LINE_NUM_OPERANDS_BAD",
  82.     "DW_DLE_LINE_SET_ADDR_ERROR",
  83.     "DW_DLE_LINE_EXT_OPCODE_BAD",
  84.     "DW_DLE_DWARF_LINE_NULL",
  85.     "DW_DLE_INCL_DIR_NUM_BAD",
  86.     "DW_DLE_LINE_FILE_NUM_BAD",
  87.     "DW_DLE_ALLOC_FAIL",
  88.     "DW_DLE_NO_CALLBACK_FUNC",
  89.     "DW_DLE_SECT_ALLOC",
  90.     "DW_DLE_FILE_ENTRY_ALLOC",
  91.     "DW_DLE_LINE_ALLOC",
  92.     "DW_DLE_FPGM_ALLOC",
  93.     "DW_DLE_INCDIR_ALLOC",
  94.     "DW_DLE_STRING_ALLOC",
  95.     "DW_DLE_CHUNK_ALLOC",
  96.     "DW_DLE_BYTEOFF_ERR",
  97.     "DW_DLE_CIE_ALLOC",
  98.     "DW_DLE_FDE_ALLOC",
  99.     "DW_DLE_REGNO_OVFL",
  100.     "DW_DLE_CIE_OFFS_ALLOC",
  101.     "DW_DLE_WRONG_ADDRESS",
  102.     "DW_DLE_EXTRA_NEIGHBORS",
  103.     "DW_DLE_WRONG_TAG",
  104.     "DW_DLE_DIE_ALLOC",
  105.     "DW_DLE_PARENT_EXISTS",
  106.     "DW_DLE_DBG_NULL",
  107.     "DW_DLE_DEBUGLINE_ERROR",
  108.     "DW_DLE_DEBUGFRAME_ERROR",
  109.     "DW_DLE_DEBUGINFO_ERROR",
  110.     "DW_DLE_ATTR_ALLOC",
  111.     "DW_DLE_ABBREV_ALLOC",
  112.     "DW_DLE_OFFSET_UFLW",
  113.     "DW_DLE_ELF_SECT_ERR",
  114.     "DW_DLE_DEBUG_FRAME_LENGTH_BAD",
  115.     "DW_DLE_FRAME_VERSION_BAD",
  116.     "DW_DLE_CIE_RET_ADDR_REG_ERROR",
  117.     "DW_DLE_FDE_NULL",
  118.     "DW_DLE_FDE_DBG_NULL",
  119.     "DW_DLE_CIE_NULL",
  120.     "DW_DLE_CIE_DBG_NULL",
  121.     "DW_DLE_FRAME_TABLE_COL_BAD",
  122.     "DW_DLE_PC_NOT_IN_FDE_RANGE",
  123.     "DW_DLE_CIE_INSTR_EXEC_ERROR",
  124.     "DW_DLE_FRAME_INSTR_EXEC_ERROR",
  125.     "DW_DLE_FDE_PTR_NULL",
  126.     "DW_DLE_RET_OP_LIST_NULL",
  127.     "DW_DLE_LINE_CONTEXT_NULL",
  128.     "DW_DLE_DBG_NO_CU_CONTEXT",
  129.     "DW_DLE_DIE_NO_CU_CONTEXT",
  130.     "DW_DLE_FIRST_DIE_NOT_CU",
  131.     "DW_DLE_NEXT_DIE_PTR_NULL",
  132.     "DW_DLE_DEBUG_FRAME_DUPLICATE",
  133.     "DW_DLE_DEBUG_FRAME_NULL",
  134.     "DW_DLE_ABBREV_DECODE_ERROR",
  135.     "DW_DLE_DWARF_ABBREV_NULL",
  136.     "DW_DLE_ATTR_NULL",
  137.     "DW_DLE_DIE_BAD",
  138.     "DW_DLE_DIE_ABBREV_BAD",
  139.     "DW_DLE_ATTR_FORM_BAD",
  140.     "DW_DLE_ATTR_NO_CU_CONTEXT",
  141.     "DW_DLE_ATTR_FORM_SIZE_BAD",
  142.     "DW_DLE_ATTR_DBG_NULL",
  143.     "DW_DLE_BAD_REF_FORM",
  144.     "DW_DLE_ATTR_FORM_OFFSET_BAD",
  145.     "DW_DLE_LINE_OFFSET_BAD",
  146.     "DW_DLE_DEBUG_STR_OFFSET_BAD",
  147.     "DW_DLE_STRING_PTR_NULL",
  148.      "DW_DLE_PUBNAMES_VERSION_ERROR",
  149.     "DW_DLE_PUBNAMES_LENGTH_BAD",
  150.     "DW_DLE_GLOBAL_NULL",
  151.     "DW_DLE_GLOBAL_CONTEXT_NULL",
  152.     "DW_DLE_DIR_INDEX_BAD",
  153.     "DW_DLE_LOC_EXPR_BAD",
  154.     "DW_DLE_DIE_LOC_EXPR_BAD",
  155.     "DW_DLE_ADDR_ALLOC",
  156.     "DW_DLE_OFFSET_BAD",
  157.     "DW_DLE_MAKE_CU_CONTEXT_FAIL",
  158.     "DW_DLE_REL_ALLOC",
  159.     "DW_DLE_ARANGE_OFFSET_BAD",
  160.     "DW_DLE_SEGMENT_SIZE_BAD",
  161.     "DW_DLE_ARANGE_LENGTH_BAD",
  162.     "DW_DLE_ARANGE_DECODE_ERROR",
  163.     "DW_DLE_ARANGES_NULL",
  164.     "DW_DLE_ARANGE_NULL",
  165.     "DW_DLE_NO_FILE_NAME",
  166.     "DW_DLE_NO_COMP_DIR",
  167.     "DW_DLE_CU_ADDRESS_SIZE_BAD",
  168.     "DW_DLE_INPUT_ATTR_BAD",
  169.     "DW_DLE_EXPR_NULL",
  170.     "DW_DLE_BAD_EXPR_OPCODE",
  171.     "DW_DLE_EXPR_LENGTH_BAD",
  172.     "DW_DLE_MULTIPLE_RELOC_IN_EXPR",
  173.     "DW_DLE_ELF_GETIDENT_ERROR",
  174.     "DW_DLE_NO_AT_MIPS_FDE",
  175.     "DW_DLE_NO_CIE_FOR_FDE",
  176.     "DW_DLE_DIE_ABBREV_LIST_NULL",
  177.     "DW_DLE_DEBUG_FUNCNAMES_DUPLICATE",
  178.     "DW_DLE_DEBUG_FUNCNAMES_NULL",
  179.     "DW_DLE_DEBUG_FUNCNAMES_VERSION_ERROR",
  180.     "DW_DLE_DEBUG_FUNCNAMES_LENGTH_BAD",
  181.     "DW_DLE_FUNC_NULL",
  182.     "DW_DLE_FUNC_CONTEXT_NULL",
  183.     "DW_DLE_DEBUG_TYPENAMES_DUPLICATE",
  184.     "DW_DLE_DEBUG_TYPENAMES_NULL",
  185.     "DW_DLE_DEBUG_TYPENAMES_VERSION_ERROR",
  186.     "DW_DLE_DEBUG_TYPENAMES_LENGTH_BAD",
  187.     "DW_DLE_TYPE_NULL",
  188.     "DW_DLE_TYPE_CONTEXT_NULL",
  189.     "DW_DLE_DEBUG_VARNAMES_DUPLICATE",
  190.     "DW_DLE_DEBUG_VARNAMES_NULL",
  191.     "DW_DLE_DEBUG_VARNAMES_VERSION_ERROR",
  192.     "DW_DLE_DEBUG_VARNAMES_LENGTH_BAD",
  193.     "DW_DLE_VAR_NULL",
  194.     "DW_DLE_VAR_CONTEXT_NULL",
  195.     "DW_DLE_DEBUG_WEAKNAMES_DUPLICATE",
  196.     "DW_DLE_DEBUG_WEAKNAMES_NULL",
  197.     "DW_DLE_DEBUG_WEAKNAMES_VERSION_ERROR",
  198.     "DW_DLE_DEBUG_WEAKNAMES_LENGTH_BAD",
  199.     "DW_DLE_WEAK_NULL",
  200.     "DW_DLE_WEAK_CONTEXT_NULL (175)",
  201.     "DW_DLE_LOCDESC_COUNT_WRONG (176)",
  202.     };
  203.  
  204.  
  205. #include "dwarf_incl.h"
  206.  
  207. /* 
  208.     This function performs error handling as described in the 
  209.     libdwarf consumer document section 3.  Dbg is the Dwarf_debug
  210.     structure being processed.  Error is a pointer to the pointer
  211.     to the error descriptor that will be returned.  Errval is an
  212.     error code listed in dwarf_error.h.
  213. */
  214. void
  215. _dwarf_error (
  216.     Dwarf_Debug     dbg,
  217.     Dwarf_Error     *error,
  218.     Dwarf_Sword     errval
  219. )
  220. {
  221.     Dwarf_Error                 errptr;
  222.     static struct Dwarf_Error_s        alt_err_struct;
  223.  
  224.     /* 
  225.     Allow NULL dbg on entry, since sometimes that can happen and
  226.         we want to report the upper-level error, not this one.
  227.     */
  228.     if (error != NULL) {
  229.  
  230.         /* 
  231.         If dbg is NULL, use the alternate error struct.
  232.         However, this will overwrite the earlier error.
  233.         */
  234.     if (dbg != NULL) {
  235.             errptr = (Dwarf_Error)_dwarf_get_alloc(dbg, DW_DLA_ERROR, 1);
  236.             if (errptr == NULL) {
  237.                 fprintf(stderr,"Could not allocate Dwarf_Error structure, abort() in libdwarf.\n");
  238.                 abort();
  239.             }
  240.     }
  241.     else 
  242.         errptr = &alt_err_struct;
  243.  
  244.         errptr->er_errval = errval;
  245.         *error = errptr;
  246.         return;
  247.     }
  248.  
  249.     if (dbg != NULL && dbg->de_errhand != NULL) {
  250.         errptr = (Dwarf_Error)_dwarf_get_alloc(dbg, DW_DLA_ERROR, 1);
  251.         if (errptr == NULL) {
  252.             fprintf(stderr,"Could not allocate Dwarf_Error structure, abort() in libdwarf.\n");
  253.             abort();
  254.         }
  255.         errptr->er_errval = errval;
  256.         dbg->de_errhand(errptr,dbg->de_errarg);
  257.         return;
  258.     }
  259.     fprintf(stderr,"abort() in libdwarf. No error argument, no handler.\n");
  260.     abort();
  261. }
  262.  
  263.  
  264. Dwarf_Unsigned
  265. dwarf_errno (
  266.     Dwarf_Error        error
  267. )
  268. {
  269.     if (error == NULL) {
  270.     return(0);
  271.     }
  272.  
  273.     return(error->er_errval);
  274. }
  275.  
  276.  
  277. /* 
  278. */
  279. char *
  280. dwarf_errmsg (
  281.     Dwarf_Error        error
  282. )
  283. {
  284.     if (error == NULL) {
  285.     return "Dwarf_Error is NULL";
  286.     }
  287.  
  288.     if (error->er_errval > (sizeof(_dwarf_errmsgs) / sizeof(char *))) {
  289.     return "Dwarf_Error value out of range";
  290.     }
  291.  
  292.     return ((char *)_dwarf_errmsgs[error->er_errval]);
  293. }
  294.